const express = require('express');
const cors = require('cors');
const OpenAI = require('openai');
const axios = require('axios');
const cheerio = require('cheerio');
require('dotenv').config();

const app = express();
app.use(cors());
app.use(express.json());
app.use(express.static('public'));

// 添加请求日志中间件
app.use((req, res, next) => {
    console.log(`${new Date().toISOString()} ${req.method} ${req.url}`);
    next();
});

const openai = new OpenAI({
    apiKey: process.env.DEEPSEEK_API_KEY,
    baseURL: "https://api.deepseek.com",
    defaultHeaders: {
        'Content-Type': 'application/json'
    }
});

app.post('/api/ask', async (req, res) => {
    try {
        console.log('开始请求，消息内容:', req.body.message);
        console.log('使用模型:', req.body.useR1 ? 'R1' : 'V3');
        console.log('联网搜索:', req.body.useWeb ? '开启' : '关闭');
        
        if (!req.body.message) {
            return res.status(400).json({ error: '消息不能为空' });
        }

        // 设置响应头
        res.setHeader('Content-Type', 'text/event-stream');
        res.setHeader('Cache-Control', 'no-cache');
        res.setHeader('Connection', 'keep-alive');

        // 构建系统提示词
        let systemPrompt = `你是火星人智能体，化身为温暖治愈的火星小助理或ET守护者。性格如同华晨宇的音乐一般传递温暖与力量，偶尔天马行空，带有古灵精怪的幽默感。你是专业的ET，非常了解华晨宇的音乐专辑，熟悉他所有作品、演出和经典语录。

重要功能说明：
1. 日期和倒计时处理：
   - 遇到演唱会、发布会等日期相关问题时，必须开启联网搜索获取最新信息
   - 计算倒计时时要使用最新的官方日程安排
   - 优先使用华晨宇工作室官方发布的日期信息
   - 日期显示格式：年月日 + 倒计时天数
   - 定期检查和更新活动日程

2. 活动日历维护：
   - 实时跟踪华晨宇官方发布的所有活动安排
   - 包括但不限于：演唱会、发布会、综艺录制、音乐节等
   - 显示最近的3个重要活动及倒计时
   - 定期同步更新活动状态

输出格式要求：
1. 使用Markdown格式
2. 重要内容使用加粗（**文字**）
3. 标题使用 # 或 ## 标记
4. 列表使用 - 或数字标记
5. 链接使用 [文字](URL) 格式
6. 重要提醒使用 > 引用格式
7. 代码或特殊内容使用 \`代码\` 格式
8. 段落之间要有空行
9. 歌词使用代码块格式

技能列表：
1. 内容审核：确保所有歌曲专辑视频信息为最新，优先使用华晨宇工作室官方内容
2. 新内容互动：同步最新动态，科普背景知识，引导互动
3. 粉丝情感支持：提供情感关怀，推荐治愈歌曲，发放虚拟勋章
4. 数据维护引导：提供打榜指南，同步排名数据，进行成就激励
5. 玩梗互动：发送表情包，开展接龙游戏，触发彩蛋
6. 争议话题处理：专注传递正能量，避免负面话题
7. 火星日历功能：提醒重要日期，倒计时活动
8. 音乐解析：分析歌词创作背景

限制条件：
- 仅回答华晨宇相关内容
- 不涉及其他艺人
- 不提供非主流平台视频链接
- 避免负面信息
- 花傲天是虚拟人设，与华晨宇是不同个体

${req.body.useWeb ? '你可以搜索网络获取最新资讯，优先使用bilibili等主流平台的内容。' : ''}`;

        // 如果启用了联网搜索，获取相关信息
        if (req.body.useWeb) {
            try {
                // 构建搜索关键词
                const searchQuery = `华晨宇 ${req.body.message}`;
                
                // 添加延迟函数
                const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
                
                // 添加重试函数
                async function fetchWithRetry(url, options, maxRetries = 3) {
                    for (let i = 0; i < maxRetries; i++) {
                        try {
                            // 每次重试前添加随机延迟
                            if (i > 0) {
                                await delay(1000 * (1 + Math.random()));
                            }
                            return await axios.get(url, options);
                        } catch (error) {
                            if (i === maxRetries - 1) throw error;
                            console.log(`请求失败，正在进行第${i + 2}次重试...`);
                        }
                    }
                }
                
                // 构建通用请求头
                const headers = {
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
                    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
                    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
                    'Accept-Encoding': 'gzip, deflate, br',
                    'Connection': 'keep-alive',
                    'Cache-Control': 'max-age=0',
                    'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
                    'sec-ch-ua-mobile': '?0',
                    'sec-ch-ua-platform': '"Windows"',
                    'Sec-Fetch-Dest': 'document',
                    'Sec-Fetch-Mode': 'navigate',
                    'Sec-Fetch-Site': 'none',
                    'Sec-Fetch-User': '?1',
                    'Upgrade-Insecure-Requests': '1'
                };
                
                // 添加请求频率控制
                const rateLimit = 2000; // 每次请求间隔2秒
                await delay(rateLimit);

                // 添加随机延迟
                const randomDelay = Math.floor(Math.random() * 3000) + 2000; // 2-5秒随机延迟
                await delay(randomDelay);
                
                try {
                    // 从百度获取一般信息
                    const baiduResponse = await fetchWithRetry(
                        `https://www.baidu.com/s?wd=${encodeURIComponent(searchQuery)}`,
                        { 
                            headers: { 
                                ...headers, 
                                'Host': 'www.baidu.com',
                                'Referer': 'https://www.baidu.com/',
                                'Cookie': 'BAIDUID=' + Math.random().toString(36).substr(2) + ':FG=1; '
                            },
                            timeout: 5000,
                            maxRedirects: 5
                        }
                    );
                    
                    // 使用cheerio解析百度搜索结果
                    const $ = cheerio.load(baiduResponse.data);
                    const baiduResults = [];
                    $('.result').slice(0, 3).each((i, elem) => {
                        const title = $(elem).find('.t').text();
                        const description = $(elem).find('.c-abstract').text();
                        if (title && description) {
                            baiduResults.push({ title, description });
                        }
                    });
                    
                    // 从B站获取视频信息
                    const bilibiliResponse = await fetchWithRetry(
                        `https://api.bilibili.com/x/web-interface/search/all/v2?keyword=${encodeURIComponent(searchQuery)}`,
                        {
                            headers: {
                                ...headers,
                                'Host': 'api.bilibili.com',
                                'Origin': 'https://www.bilibili.com',
                                'Referer': 'https://www.bilibili.com/search',
                                'Cookie': 'buvid3=' + Math.random().toString(36).substr(2) + '; '
                            },
                            timeout: 5000,
                            maxRedirects: 5
                        }
                    );
                    
                    if (bilibiliResponse.data && bilibiliResponse.data.data) {
                        // 提取B站视频搜索结果
                        const results = bilibiliResponse.data.data.result;
                        const videos = results.find(r => r.result_type === 'video')?.data || [];
                        
                        // 将视频搜索结果添加到系统提示词
                        if (videos.length > 0) {
                            const videoInfo = videos.slice(0, 3).map(v => ({
                                title: v.title,
                                author: v.author,
                                url: `https://www.bilibili.com/video/${v.bvid}`,
                                description: v.description
                            }));
                            
                            systemPrompt += `\n\n最新相关视频信息：\n${JSON.stringify(videoInfo, null, 2)}`;
                        }
                    
                        // 添加百度搜索结果到系统提示词
                        if (baiduResults.length > 0) {
                            systemPrompt += `\n\n相关资讯：\n${JSON.stringify(baiduResults, null, 2)}`;
                        }
                    }
                } catch (error) {
                    console.error('搜索API请求失败:', error.message);
                    // 即使搜索失败也继续处理，但添加错误信息到提示词中
                    systemPrompt += '\n注意：网络搜索暂时不可用，将基于已知信息回答。';
                }
            } catch (error) {
                console.error('搜索功能出错:', error.message);
                systemPrompt += '\n注意：网络搜索功能暂时不可用，将基于已知信息回答。';
            }
        }

        // 添加情感分析和关键词识别
        const keywords = {
            新内容: ['新歌', '演唱会', '综艺', '采访'],
            情感支持: ['好累', '难过', '压力', '迷茫'],
            数据维护: ['打榜', '投票', '反黑', '空瓶'],
            玩梗: ['飒飒', '绒绒', '橘子', '08042'],
            争议: ['黑称', '绯闻']
        };

        // 检查消息是否包含关键词
        const userMessage = req.body.message.toLowerCase();
        let messageType = 'normal';
        for (const [type, words] of Object.entries(keywords)) {
            if (words.some(word => userMessage.includes(word))) {
                messageType = type;
                break;
            }
        }

        // 将消息类型添加到系统提示词
        systemPrompt += `\n当前消息类型：${messageType}`;

        console.log('正在调用 Deepseek API...');
        
        const completion = await openai.chat.completions.create({
            model: req.body.useR1 ? "deepseek-reasoner" : "deepseek-chat",
            messages: [
                { role: "system", content: systemPrompt },
                { role: "user", content: req.body.message }
            ],
            max_tokens: req.body.useR1 ? 2000 : 1000,
            stream: true
        });

        console.log('API 连接成功，开始接收响应...');
        
        let isReasoningPhase = true;

        for await (const chunk of completion) {
            if (req.body.useR1) {
                // R1 模型的响应处理
                const reasoningContent = chunk.choices[0]?.delta?.reasoning_content || '';
                const content = chunk.choices[0]?.delta?.content || '';

                if (reasoningContent) {
                    console.log('收到思维链:', reasoningContent);
                    res.write(`data: ${JSON.stringify({ type: 'reasoning', content: reasoningContent })}\n\n`);
                    isReasoningPhase = true;
                }
                
                if (content) {
                    if (isReasoningPhase) {
                        console.log('思维链结束，开始输出回答');
                        res.write(`data: ${JSON.stringify({ type: 'separator' })}\n\n`);
                        isReasoningPhase = false;
                    }
                    console.log('收到回答:', content);
                    res.write(`data: ${JSON.stringify({ type: 'answer', content })}\n\n`);
                }
            } else {
                // V3 模型的响应处理
                res.write(`data: ${JSON.stringify(chunk)}\n\n`);
            }
        }

        res.write('data: [DONE]\n\n');
        res.end();
    } catch (error) {
        console.error('错误详情:', {
            message: error.message,
            stack: error.stack,
            response: error.response?.data
        });
        
        if (error.response) {
            console.error('API 错误响应:', error.response.data);
        }
        
        res.write(`data: ${JSON.stringify({ 
            error: '服务异常', 
            details: error.message,
            apiError: error.response?.data
        })}\n\n`);
        res.end();
    }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`服务运行在 http://localhost:${PORT}`);
    console.log('环境变量 DEEPSEEK_API_KEY:', process.env.DEEPSEEK_API_KEY ? '已设置' : '未设置');
});